﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataAccessComponents;
using System.Collections.ObjectModel;
using DAL;

namespace BusinessLogicLayer
{
    public class OddzialBL : IBusinessLogicLayer<Oddzial>
    {
        private DbOperations dal = new DbOperations();

        /// <summary>
        /// Funckcja dodająca oddział do bazy danych
        /// </summary>
        /// <param name="objDodaj">Obiekt do dodania</param>
        /// <returns>Indeks dodanego wiersza</returns>
        public int dodaj(Oddzial objDodaj)
        {
            AdresBL adresBL = new AdresBL();
            objDodaj.Id_adres = adresBL.dodaj(objDodaj.Adres);

            return dal.dodajOddzial(objDodaj);
        }

        /// <summary>
        /// Funkcja usuwająca oddział z bazy danych
        /// </summary>
        /// <param name="idusun">Id wiersza do usuniecia</param>
        public void usun(int idusun)
        {
            dal.usunOddzial(idusun);
        }

        /// <summary>
        /// Funkcja akutalizująca oddział
        /// </summary>
        /// <param name="objAktualizuj">Obiekt do aktualizacji </param>
        public void aktualizuj(Oddzial objAktualizuj)
        {
            AdresBL adresBL = new AdresBL();
            adresBL.aktualizuj(objAktualizuj.Adres);           

            dal.aktualizujOddzial(objAktualizuj);
        }

        /// <summary>
        /// Funkcja zwracająca oddzial o danym id
        /// </summary>
        /// <param name="idpobierz"></param>
        /// <returns></returns>
        public Oddzial pobierz(int idpobierz)
        {
            AdresBL adresBL = new AdresBL();
            Oddzial oddzial = dal.pobierzOddzial(idpobierz);
            oddzial.Adres = adresBL.pobierz(oddzial.Id_adres);
            return oddzial;
        }

        /// <summary>
        /// Funkcja zwracająca liste oddziałów
        /// </summary>
        /// <returns></returns>
        public ObservableCollection<Oddzial> pobierzListe()
        {
            ObservableCollection<Oddzial> tmp = dal.pobierzListeOddzial();
            AdresBL adresBL = new AdresBL();
            foreach (Oddzial oddzial in tmp)
            {
                oddzial.Adres = adresBL.pobierz(oddzial.Id_adres);
            }
            return tmp;
        }

        /// <summary>
        /// Funkcja aktualizująca pozyjce oddziałow w bazie danych, a gdy id_oddzial wynosi 0 to dodaje go do bazy
        /// </summary>
        /// <param name="lista">Lista obiektów do zakutalizowania</param>
        /// <returns></returns>
        public bool aktualizujListe(ObservableCollection<Oddzial> lista)
        {
            AdresBL adresBL = new AdresBL();
            foreach (Oddzial odzial in lista)
            {
                if (odzial.Id_oddzial == 0)
                {
                    odzial.Id_adres = adresBL.dodaj(odzial.Adres);
                    this.dodaj(odzial);
                }
                else
                {
                    this.aktualizuj(odzial);
                }
            }
            return true;
        }

        public bool usun(ObservableCollection<Oddzial> lista)
        {
            AdresBL adresBL = new AdresBL();
            foreach (Oddzial odzial in lista)
            {
                // usuwanie oddzialu
                this.usun(odzial.Id_oddzial);

                // usuwanie adresu
                adresBL.usun(odzial.Id_adres);                
            }
            return true;
        }
    }
}
